#include <logstream/log_stream.h>
#include <string>
#include <vector>
#if KP_HAS_SOURCE_LOCATION
#include <source_location>
#endif

using namespace kp::io;

int
main()
{
    // 基础配置：前缀、线程ID、时区
    message.formatter().set_prefix("example");
    message.log_thread_id(true);
    message.set_timezone(0); // UTC

    // 级别映射与最小输出级别
    message.set_min_log_level(LogStream::normal);
    int lv_info = message.message_type_to_log_level(LogStream::normal);

    // 基本输出（按当前分隔符，默认空格）
    message("Hello", 123, 3.14);

    // RAII 作用域前缀
    {
        LogStream::Prefix scope(message, "init");
        message("scoped log");
    }

    // 手动前缀栈（TLS）
    message.push_prefix_tls("manual");
    message("prefix stack", "top");
    message.pop_prefix_tls();

    // 分隔符设置（char 与 string）
    message.set_delimiter(',');
    message("comma", "separated", 3);
    message.set_delimiter(std::string{" | "});
    message("pipe", "delim");

    // 容器输出：append(range) 与 append(range, delimiter)
    std::vector<int> nums{1, 2, 3};
    message.append(nums);
    message.append(nums, ":");

    // 流缓冲与刷新：get_stream + emit_buffered，支持 manipulators
    message.get_stream() << "streamed" << ' ' << 42;
    message.emit_buffered();
    message << std::endl; // 通过操作符触发刷新

    // 源位置信息：显式与（示例）启用显示
#if KP_HAS_SOURCE_LOCATION
    message(std::source_location::current(), "with location");
    message.formatter().enable_source(true);
    message("auto source enabled");
#endif

    // 显式设置源信息
    message.formatter().set_source("manual.cpp", 42, "func");
    message("manual source set");

    // 深度 RAII 与手动调整
    {
        LogStream::Depth d(message, 2);
        message("depth-raii");
    }
    message.add_depth_tls(1);
    message("depth-manual");
    message.add_depth_tls(-1);

    // 读取当前分隔符，并直接写到控制台
    message.get_console() << "current delimiter=" << message.delimiter() << std::endl;

    // 自定义复合 sink：收集行到内存容器
    std::vector<std::string> collector;
    message.attach_sink([&collector](const std::string & line) { collector.push_back(line); });
    message("to custom sink");

    // 直接通过 sinks 写出原始行（无头部）
    message.sinks().write_line("raw line without header");

    // 文件 sink：附加、刷新策略、写入、轮转与统计
    message.attach_file_sink("kp.log", /*append=*/true);
    message.set_flush_on_write(true);
    message("to file sink");
    message.configure_file_rotation(10 * 1024, 3); // 10KB，保留3个备份
    message.rotate_file_sinks("kp-rotated.log", /*append=*/true);
    message.get_console() << "file sink count=" << message.file_sink_count() << std::endl;

    // 显式 FileSink 实例并附加
    auto fs = std::make_unique<SinkManager::FileSink>("extra.log", /*append=*/true);
    fs->set_flush_on_write(true);
    message.sinks().attach_file_sink(std::move(fs));
    message("to extra file sink");

    // set_output_file：切换输出文件
    message.set_output_file("out.log", /*append=*/true);
    message("to output file");

    // 直接获取文件流并写入
    if (auto f = message.get_file_stream())
    {
        (*f) << "direct file write\n";
    }

    // 主进程控制：only_master 与自定义判定
    message.set_master_checker([]() { return true; });
    message.switch_only_master(true);
    if (message.is_master())
    {
        message("only master emits");
    }

    // 构建与直接发出消息
    std::string built = message.build_message("manual build");
    message.emit_message(built, lv_info);

    // 局部实例演示
    LogStream local(LogStream::normal, "local", true, "");
    local.log_thread_id(true);
    local("Hello from local instance");
    std::vector<std::string> words{"a", "b", "c"};
    local.append(words, "-");
    // 追加完区间后刷新当前行缓冲，确保出现在屏幕与文件中
    local.emit_all_buffered();

    // -------------------------------------------------------------
    // stlcompat 格式化功能更多示例（kp::vformat 支持的 {:spec}）
    // -------------------------------------------------------------
    // 整型：基数、前缀、宽度、零填充、符号控制
    message("int bases: d={} x={} X={} o={}", 255, 255, 255, 255);
    message("sign control: +={:+d} blank={: d}", 42, 42);
    message("zero pad width: {:0>8d} {:0>8d}", 42, -42);
    message("hex alt + zero pad: {:#010x} ALT {:#010X}", 3735928559ULL, 3735928559ULL);
    message("oct alt: {:#o}", 511);

    // 浮点：精度、风格、大小写、强制小数点
    message("float fixed/sci/gen: {:.3f} {:.2E} {:g}", 3.1415926, 3.1415926, 3.1415926);
    message("float showpoint-#: {:#.0f} {:#.0F}", 3.0, 3.0);

    // 字符串：精度截断与对齐/填充
    message("string precision: {:.5s}", "abcdefghijk");
    message("center fill: {:*^12s}", "hi");
    message("left/right align: {:<10s}|{:>10s}", "left", "right");
    message("string_view precision: {:.3s}", std::string_view{"abcdef"});

    // 布尔与字符：文本/数字双模式
    message("bool text/numeric: {} {:d} {:d}", true, true, false);
    message("char text/numeric: {} {:d} {:d}", 'A', 'A', 'z');

#if KP_HAS_SOURCE_LOCATION
    // 搭配源位置信息的 {:spec} 示例
    message(std::source_location::current(),
            "with loc & spec: hex={:#08x} pos={:+06d} str={:*^8s}",
            0xBEEF,
            123,
            "ok");
#endif

    // 关闭并清理文件 sinks
    message.close_file_sinks();
    message.clear_file_sinks();

    return 0;
}
